﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SisGAC.Migrations;

namespace SisGAC.Models
{
    public class SisgacContext : DbContext
    {
        public SisgacContext() :
            base("DefaultConnection")
        {
        }
        public DbSet<UserProfile> UserProfiles { get; set; }
        public DbSet<Artigo> Artigos { get; set; }
        public DbSet<Area> Areas { get; set; }

        public DbSet<Pessoa> Pessoas { get; set; }
        public DbSet<Criterio> Criterios { get; set; }

        public DbSet<AvaliacaoArtigo> AvaliacoesArtigos { get; set; }

        public DbSet<NotaAvaliacao> NotasAvaliacoes { get; set; }

        public DbSet<Congresso> Congressos { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<SisgacContext, Configuration>());
        }
    }

    [Table("Artigo")]
    public class Artigo
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int ArtigoId { get; set; }

        [Required]
        [DisplayName("Título")]
        public string Titulo { get; set; }

        [DisplayName("Número de Autores")]
        public int NumeroAutores { get; set; }

        [DisplayName("Data de Cadastro")]
        public DateTime DataCriacao { get; set; }

        [DisplayName("Situação")]
        public string Situacao { get; set; }

        [DataType(DataType.MultilineText)]
        [DisplayName("Observação")]
        public string Observacao { get; set; }

        [Required]
        [DataType(DataType.MultilineText)]
        public string Resumo { get; set; }

        [Required]
        [DataType(DataType.MultilineText)]
        public string Abstract { get; set; }
        
        public byte[] Arquivo { get; set; }
        public string TipoConteudoArquivo { get; set; }

        [DisplayName("Área")]
        public virtual Area Area { get; set; }

        public virtual UserProfile CadastradoPor { get; set; }

        public virtual ICollection<Pessoa> Autores { get; set; }

        public virtual ICollection<AvaliacaoArtigo> Avaliacoes { get; set; }

        public virtual Congresso Congresso { get; set; }

    }

    [Table("Area")]
    public class Area
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int AreaId { get; set; }
        public string Nome { get; set; }

        public virtual ICollection<Artigo> Artigos { get; set; }
        public virtual ICollection<Pessoa> Avaliadores { get; set; }
    }

    [Table("Pessoa")]
    public class Pessoa
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int PessoaId { get; set; }

        public virtual UserProfile Account { get; set; }

        [Required]
        [RegularExpression(@"^\d{3}\.\d{3}\.\d{3}\-\d{2}$", ErrorMessage = "CPF inválido")]
        [Remote("CPFDisponivel", "Pessoas", AdditionalFields = "CPFAtual")]
        public string CPF { get; set; }

        [RegularExpression("^[0-9]+$", ErrorMessage = "O RG deve possuir apenas números")]
        public string RG { get; set; }

        [Required]
        public string Nome { get; set; }

        [DisplayName("Endereço")]
        public string Endereco { get; set; }

        [DisplayName("Profissão")]
        public string Profissao { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        [DataType(DataType.PhoneNumber)]
        public int Telefone { get; set; }

        [DisplayName("Data de Nascimento")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataNascimento { get; set; }

        [DisplayName("Formação")]
        public string Formacao { get; set; }

        [DisplayName("Instituição")]
        public string Instituicao { get; set; }

        public bool Usuario { get; set; }
        public bool Coordenador { get; set; }
        public bool Avaliador { get; set; }
        public bool Autor { get; set; }

        public virtual ICollection<Area> Areas { get; set; }

        public virtual ICollection<Artigo> Artigos { get; set; }

        public virtual ICollection<AvaliacaoArtigo> Avaliacoes { get; set; }

        public virtual ICollection<Congresso> CongressosCoordenados { get; set; }

    }

    [Table("Criterio")]
    public class Criterio
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int CriterioId { get; set; }
        [Required]
        public string Nome { get; set; }
    }

    [Table("AvaliacaoArtigo")]
    public class AvaliacaoArtigo
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int AvaliacaoArtigoId { get; set; }

        public virtual Artigo Artigo { get; set; }
        public virtual Pessoa Avaliador { get; set; }
        public virtual Criterio Criterio { get; set; }

        public virtual ICollection<NotaAvaliacao> Notas { get; set; }
        
        public int Nota { get; set; }
        
        public string Comentario { get; set; }
    }

    [Table("NotasAvaliacoes")]
    public class NotaAvaliacao
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int NotaAvaliacaoId { get; set; }
        public virtual AvaliacaoArtigo Avaliacao { get; set; }
        public virtual Criterio Criterio { get; set; }
        public double Nota { get; set; }
    }

    [Table("Congressos")]
    public class Congresso
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int CongressoId { get; set; }

        [Required]
        [DisplayName("Título")]
        public string Titulo { get; set; }
        [Required]
        public virtual Pessoa Coordenador { get; set; }
        [DisplayName("Local")]
        public string Local { get; set; }

        [DisplayName("Início da submissão de artigos")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataInicioSubmissao { get; set; }
        
        [DisplayName("Fim da submissão de artigos")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataFimSubmissao { get; set; }

        [DisplayName("Início da avaliação de artigos")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataInicioAvaliacao { get; set; }
        
        [DisplayName("Fim da avaliação de artigos")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataFimAvaliacao { get; set; }

        [DisplayName("Início do congresso")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataInicioCongresso { get; set; }
        
        [DisplayName("Fim do congresso")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime DataFimCongresso { get; set; }

        [DisplayName("Número de Artigos")]
        public int NumeroArtigos { get; set; }

        public virtual ICollection<Artigo> Artigos { get; set; }
    }
}